package com.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * 242. 有效的字母异位词
 * 使用 哈希表(HashMap) 记录字符数, 判断最终字符是否一致
 *
 * @author fy
 * @date 2022/4/6 14:25
 */
public class Solution242_3 {

    /**
     * 使用stream流统计不为0的个数
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char ch1 = s.charAt(i);
            char ch2 = t.charAt(i);
            map.put(ch1, map.getOrDefault(ch1, 0) + 1);
            map.put(ch2, map.getOrDefault(ch2, 0) - 1);
        }
        return map.values()
                .stream()
                .mapToInt(Integer::intValue)
                .filter(item -> item != 0)
                .count() <= 0;
    }

    /**
     * 使用传统方式统计个数
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram1(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char ch1 = s.charAt(i);
            char ch2 = t.charAt(i);
            map.put(ch1, map.getOrDefault(ch1, 0) + 1);
            map.put(ch2, map.getOrDefault(ch2, 0) - 1);
        }
        for (Integer val : map.values()) {
            if (!Integer.valueOf(0).equals(val)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 在计数的时候就比较不为0的
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram2(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char ch1 = s.charAt(i);
            map.put(ch1, map.getOrDefault(ch1, 0) + 1);
        }
        for (int i = 0; i < t.length(); i++) {
            char ch2 = t.charAt(i);
            map.put(ch2, map.getOrDefault(ch2, 0) - 1);
            if (map.get(ch2) < 0) {
                return false;
            }
        }
        return true;
    }

}
